home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / gkismet / PacketWindow.pm < prev    next >
Text File  |  2005-10-20  |  10KB  |  365 lines

  1. #!/usr/bin/perl -w
  2. #
  3. # $Id: PacketWindow.pm,v 1.22 2003/08/04 23:13:18 solovam Exp $
  4. #
  5. # This file is a part of gkismet
  6. #
  7. # This program is free software; you can redistribute it and/or
  8. # modify it under the terms of the GNU General Public License
  9. # as published by the Free Software Foundation; either version 2
  10. # of the License, or (at your option) any later version.
  11. #
  12. # This program is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. # GNU General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU General Public License
  18. # along with this program; if not, write to the Free Software
  19. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  20. #
  21.  
  22. #
  23. # PacketWindow class
  24. #
  25. package PacketWindow;
  26.  
  27. use Gtk;
  28. use Misc;
  29. use ClistWindow;
  30. use strict;
  31.  
  32. @PacketWindow::ISA = qw(ClistWindow);
  33.  
  34. my %protocol_info_type = (proto_unknown => 0, proto_udp => 1, proto_misc_tcp => 2, proto_arp => 3, proto_dhcp_server => 4, proto_cdp => 5,
  35.     proto_netbios => 6, proto_netbios_tcp => 7, proto_ipx => 8, proto_ipx_tcp => 9, proto_turbocell => 10,
  36.     proto_netstumbler => 11, proto_lucenttest => 12, proto_wellenreiter => 13, proto_gstsearch => 14);
  37. my %protocol_netbios_type = (proto_netbios_unknown => 0, proto_netbios_host => 1, proto_netbios_master => 2, proto_netbios_domain => 3,
  38.     proto_netbios_query => 4, proto_netbios_pdcquery => 5); 
  39. my %packet_type = (packet_noise => -2,    # We're too short or otherwise corrupted
  40.     packet_unknown => -1,        # What are we?
  41.     packet_management => 0,        # LLC management
  42.     packet_phy => 1,        # Physical layer packets, most drivers can't provide these
  43.     packet_data => 2);        # Data frames
  44. my %packet_sub_type = (
  45.     packet_sub_unknown => -1,
  46.     # Management subtypes
  47.     packet_sub_association_req => 0,
  48.     packet_sub_association_resp => 1,
  49.     packet_sub_reassociation_req => 2,
  50.     packet_sub_reassociation_resp => 3,
  51.     packet_sub_probe_req => 4,
  52.     packet_sub_probe_resp => 5,
  53.     packet_sub_beacon => 8,
  54.     packet_sub_atim => 9,
  55.     packet_sub_disassociation => 10,
  56.     packet_sub_authentication => 11,
  57.     packet_sub_deauthentication => 12,
  58.     # Phy subtypes
  59.     packet_sub_rts => 11,
  60.     packet_sub_cts => 12,
  61.     packet_sub_ack => 13,
  62.     packet_sub_cf_end => 14,
  63.     packet_sub_cf_end_ack => 15,
  64.     # Data subtypes
  65.     packet_sub_data => 0,
  66.     packet_sub_data_cf_ack => 1,
  67.     packet_sub_data_cf_poll => 2,
  68.     packet_sub_data_cf_ack_poll => 3,
  69.     packet_sub_data_null => 4,
  70.     packet_sub_cf_ack => 5,
  71.     packet_sub_cf_ack_poll => 6);
  72. my %distribution_type = (no_distribution => 0, from_distribution => 1, to_distribution => 2, inter_distribution => 3, adhoc_distribution => 4);
  73. my %turbocell_type = (
  74.     turbocell_unknown => 0,
  75.     turbocell_ispbase => 1,     # 0xA0
  76.     turbocell_pollbase => 2,    # 0x80
  77.     turbocell_nonpollbase => 3,    # 0x00
  78.     turbocell_base => 4);        # 0x40
  79.  
  80. #
  81. # Tell connection to start sending the info
  82. #
  83. sub activateConnection
  84. {
  85.     my $self = shift;
  86.     if($self->{'gKismetApplication'}->countObservers('PacketWindow') < 1)
  87.     {
  88.         $self->{'connection'}->enablePackets();
  89.     }
  90. }
  91.  
  92. #
  93. # Tell connection to stop sending the info
  94. #
  95. sub deactivateConnection
  96. {
  97.     my $self = shift;
  98.     if($self->{'gKismetApplication'}->countObservers('PacketWindow') == 1)
  99.     {
  100.         $self->{'connection'}->disablePackets();
  101.     }
  102. }
  103.  
  104. #
  105. # Is it a worthwhile update?
  106. #
  107. sub isInterstingUpdate
  108. {
  109.     my $self = shift;
  110.     my $data = shift;
  111.  
  112.     if($data->{'changed'} eq 'packet' && $self->{'connection'}->getPacket()->{'bssid'} eq $self->{'bssid'})
  113.     {
  114.         return $true;
  115.     }
  116.     else
  117.     {
  118.         return $false;
  119.     }
  120. }
  121.  
  122. #
  123. # Window name (title)
  124. #
  125. sub getWindowName
  126. {
  127.     return 'Packet dump';
  128. }
  129.  
  130. #
  131. # Titles for CList columns
  132. #
  133. sub getColumnTitles
  134. {
  135.         return ('Time', 'BSSID', 'SSID', 'Source MAC', 'Destination MAC', 'Packet Type', 'Packet Info');
  136. }
  137.  
  138. #
  139. # How many lines to show in window
  140. #
  141. sub getWindowDepth
  142. {
  143.     my $self = shift;
  144.     return $self->{'gKismetApplication'}{'preferences'}->getPref('packetDepth');
  145. }
  146.  
  147.  
  148. #
  149. # Get column data
  150. #
  151. sub getColumnData
  152. {
  153.     my $self = shift;
  154.  
  155.     my $packet = $self->{'connection'}->getPacket();
  156.     my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($packet->{'timesec'});
  157.     my $time = sprintf("%.2d:%.2d:%.2d", $hour, $min, $sec);
  158.     my $bssid = $packet->{'bssid'};
  159.     my $ssid = $packet->{'ssid'};
  160.     my $srcmac = $packet->{'sourcemac'};
  161.     my $dstmac = $packet->{'destmac'};
  162.     my $ptype = '';
  163.     my $pinfo = '';
  164.     if($packet->{'type'} == $packet_type{'packet_noise'})
  165.     {
  166.         $ptype = 'NOISE';
  167.     }
  168.     elsif($packet->{'type'} == $packet_type{'packet_unknown'})
  169.     {
  170.         $ptype = 'UNKNOWN';
  171.     }
  172.     elsif($packet->{'type'} == $packet_type{'packet_management'} )
  173.     {
  174.         $ptype = 'MANAGEMENT';
  175.         if($packet->{'subtype'} == $packet_sub_type{'packet_sub_association_req'})
  176.         {
  177.             $pinfo = "Association Request";
  178.         }
  179.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_association_resp'})
  180.         {
  181.             $pinfo = "Association Response";
  182.         }
  183.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_reassociation_req'})
  184.         {
  185.             $pinfo = "Reassociation Request";
  186.         }
  187.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_reassociation_resp'})
  188.         {
  189.             $pinfo = "Reassociation Response";
  190.         }
  191.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_probe_req'})
  192.         {
  193.             $pinfo = "Probe Request";
  194.         }
  195.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_probe_resp'})
  196.         {
  197.             $pinfo = "Probe Response";
  198.         }
  199.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_beacon'})
  200.         {
  201.             $pinfo = "Beacon";
  202.         }
  203.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_atim'})
  204.         {
  205.             $pinfo = "ATIM";
  206.         }
  207.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_disassociation'})
  208.         {
  209.             $pinfo = "Disassociation";
  210.         }
  211.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_authentication'})
  212.         {
  213.             $pinfo = "Authentication";
  214.         }
  215.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_deauthentication'})
  216.         {
  217.             $pinfo = "Deauthentication";
  218.         }
  219.         else
  220.         {
  221.             $pinfo = "Unknown";
  222.         }
  223.     }
  224.     elsif($packet->{'type'} == $packet_type{'packet_phy'})
  225.     {
  226.         $ptype = 'PHY';
  227.         if($packet->{'subtype'} == $packet_sub_type{'packet_sub_rts'})
  228.         {
  229.             $pinfo = "Ready To Send";
  230.         }
  231.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_cts'})
  232.         {
  233.             $pinfo = "Clear To Send";
  234.         }
  235.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_ack'})
  236.         {
  237.             $pinfo = "Data Ack";
  238.         }
  239.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_cf_end'})
  240.         {
  241.             $pinfo = "CF End";
  242.         }
  243.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_cf_end_ack'})
  244.         {
  245.             $pinfo = "CF End+Ack";
  246.         }
  247.         else
  248.         {
  249.             $pinfo = "Unknown";
  250.         }
  251.     }
  252.     elsif($packet->{'type'} == $packet_type{'packet_data'})
  253.     {
  254.         $ptype .= 'DATA';
  255.         if($packet->{'encrypted'})
  256.         {
  257.             $pinfo = 'Encrypted ';
  258.         }
  259.         if($packet->{'weak'})
  260.         {
  261.             $pinfo = 'Weak ';
  262.         }
  263.         if($packet->{'subtype'} == $packet_sub_type{'packet_sub_data'})
  264.         {
  265.             if($packet->{'prototype'} == $protocol_info_type{'proto_netbios'} ||
  266.                 $packet->{'prototype'} == $protocol_info_type{'proto_netbios_tcp'})
  267.             {
  268.                 $pinfo .= "NETBIOS";
  269.                 if($packet->{'nbtype'} == $protocol_netbios_type{'proto_netbios_host'})
  270.                 {
  271.                     $pinfo .= "HOST ";
  272.                 }
  273.                 elsif($packet->{'nbtype'} == $protocol_netbios_type{'proto_netbios_master'})
  274.                 {
  275.                     $pinfo .= "MASTER ";
  276.                 }
  277.                 elsif($packet->{'nbtype'} == $protocol_netbios_type{'proto_netbios_domain'})
  278.                 {
  279.                     $pinfo .= "DOMAIN ";
  280.                 }
  281.                 elsif($packet->{'nbtype'} == $protocol_netbios_type{'proto_netbios_query'})
  282.                 {
  283.                     $pinfo .= "QUERY ";
  284.                 }
  285.                 elsif($packet->{'nbtype'} == $protocol_netbios_type{'proto_netbios_pdcquery'})
  286.                 {
  287.                     $pinfo .= "PDC QUERY ";
  288.                 }
  289.                 $pinfo .= $packet->{'nbsource'};
  290.             }
  291.             elsif($packet->{'prototype'} == $protocol_info_type{'proto_udp'} ||
  292.                 $packet->{'prototype'} == $protocol_info_type{'proto_dhcp_server'})
  293.             {
  294.                 $pinfo .= 'UDP ' . $packet->{'sourceip'} . ':' . PacketWindow->xgetservbyport($packet->{'sourceport'}, 'udp') .
  295.                     " -> " . $packet->{'destip'} . ':' . PacketWindow->xgetservbyport($packet->{'destport'}, 'udp');
  296.             }
  297.             elsif($packet->{'prototype'} == $protocol_info_type{'proto_misc_tcp'})
  298.             {
  299.                 $pinfo .= 'TCP ' . $packet->{'sourceip'} . ':' . PacketWindow->xgetservbyport($packet->{'sourceport'}, 'tcp') .
  300.                     " -> " . $packet->{'destip'} . ':' . PacketWindow->xgetservbyport($packet->{'destport'}, 'tcp');
  301.             }
  302.             elsif($packet->{'prototype'} == $protocol_info_type{'proto_arp'})
  303.             {
  304.                 $pinfo .= 'ARP ' . $packet->{'sourceip'} . ' -> ' . $packet->{'destip'};
  305.             }
  306.             elsif($packet->{'prototype'} == $protocol_info_type{'proto_ipx_tcp'})
  307.             {
  308.                 $pinfo .= 'IPX';
  309.             }
  310.         }
  311.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_data_cf_ack'})
  312.         {
  313.             $pinfo .= "Data+CF+Ack";
  314.         }
  315.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_data_cf_poll'})
  316.         {
  317.             $pinfo .= "Data+CF+Poll";
  318.         }
  319.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_data_cf_ack_poll'})
  320.         {
  321.             $pinfo .= "Data+CF+Ack+Poll";
  322.         }
  323.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_data_null'})
  324.         {
  325.             $pinfo .= "Data Null";
  326.         }
  327.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_cf_ack'})
  328.         {
  329.             $pinfo .= "CF Ack";
  330.         }
  331.         elsif($packet->{'subtype'} == $packet_sub_type{'packet_sub_cf_ack_poll'})
  332.         {
  333.             $pinfo .= "CF Ack+Poll";
  334.         }
  335.         else
  336.         {
  337.             $pinfo .= "Unknown";
  338.         }
  339.     }
  340.     else
  341.     {
  342.         $ptype = 'UNKNOWN';
  343.     }
  344.  
  345.     return($time, $bssid, $ssid, $srcmac, $dstmac, $ptype, $pinfo);
  346. }
  347.  
  348. sub xgetservbyport
  349. {
  350.     shift;
  351.     my $port = shift;
  352.     my $proto = shift;
  353.     my $name = getservbyport($port, $proto);
  354.     if($name)
  355.     {
  356.         return $name;
  357.     }
  358.     else
  359.     {
  360.         return $port;
  361.     }
  362. }
  363.  
  364. 1;
  365.